package cn.kais.drawer.menu;

import java.math.RoundingMode;
import java.util.Objects;

/**
 * 小数 舍入模式
 * 英文：Rounding ；中文：舍入模式
 * 大概就是数学上的四舍五入：数值0-4舍去；数值5-9进位。
 * java.math.RoundingMode：这是一种枚举类型，它定义了8种数据的舍入模式。
 * 分别是：ROUND_UP，ROUND_DOWN，ROUND_CEILING，ROUND_FLOOR，ROUND_HALF_UP，ROUND_HALF_DOWN，ROUND_HALF_EVEN，ROUND_UNNECESSARY
 * ROUND_UP：向远离零的方向舍入。 若舍入位为非零，则对舍入部分的前一位数字加1；若舍入位为零，则直接舍弃。即为向外取整模式。
 * ROUND_DOWN：向接近零的方向舍入。 不论舍入位是否为零，都直接舍弃。即为向内取整模式。
 * ROUND_CEILING：向正无穷大的方向舍入。 若 BigDecimal 为正，则舍入行为与 ROUND_UP 相同；若为负，则舍入行为与 ROUND_DOWN 相同。即为向上取整模式。
 * ROUND_FLOOR：向负无穷大的方向舍入。 若 BigDecimal 为正，则舍入行为与 ROUND_DOWN 相同；若为负，则舍入行为与 ROUND_UP 相同。即为向下取整模式。
 * ROUND_HALF_UP：向“最接近的”整数舍入。 若舍入位大于等于5，则对舍入部分的前一位数字加1；若舍入位小于5，则直接舍弃。即为四舍五入模式。
 * ROUND_HALF_DOWN：向“最接近的”整数舍入。 若舍入位大于5，则对舍入部分的前一位数字加1；若舍入位小于等于5，则直接舍弃。即为五舍六入模式。
 * ROUND_HALF_EVEN：向“最接近的”整数舍入。 若（舍入位大于5）或者（舍入位等于5且前一位为奇数），则对舍入部分的前一位数字加1；若（舍入位小于5）或者（舍入位等于5且前一位为偶数），则直接舍弃。即为银行家舍入模式。
 * ROUND_UNNECESSARY 断言请求的操作具有精确的结果，因此不需要舍入。
 */
public enum MenuNumberRound {

    CEILING("1", RoundingMode.CEILING),     // 向上取整
    FLOOR("2", RoundingMode.FLOOR),         // 向下取整
    HALF_UP("3", RoundingMode.HALF_UP),     // 四舍五入
    HALF_EVEN("4", RoundingMode.HALF_EVEN), // 银行家

    UP("5", RoundingMode.UP),               // 向外取整
    DOWN("6", RoundingMode.DOWN),           // 向内取整
    HALF_DOWN("7", RoundingMode.HALF_DOWN), // 五舍六入 // 未用
    ;

    public final String code;
    public final RoundingMode mode;

    MenuNumberRound(String code, RoundingMode mode) {
        this.code = code;
        this.mode = mode;
    }

    public static MenuNumberRound onParseCode(String code) {
        for (MenuNumberRound menu : MenuNumberRound.values()) {
            if (Objects.equals(menu.code, code)) {
                return menu;
            }
        }
        return HALF_UP;
    }

}
